<!DOCTYPE html>
<html lang="zh-CN,en,zh-TW,default">
  <head hexo-theme='https://github.com/volantis-x/hexo-theme-volantis/tree/4.2.0'>
  <meta charset="utf-8">
  <!-- SEO相关 -->
  
    
  
  <!-- 渲染优化 -->
  <meta http-equiv='x-dns-prefetch-control' content='on' />
  <link rel='dns-prefetch' href='https://cdn.jsdelivr.net'>
  <link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin>
  <meta name="renderer" content="webkit">
  <meta name="force-rendering" content="webkit">
  <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
  <meta name="HandheldFriendly" content="True" >
  <meta name="apple-mobile-web-app-capable" content="yes">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">

  <!-- 页面元数据 -->
  
  <title>字节跳动-深圳Data-后台工程师-一二三面 - Yayako&#39;s Blog</title>
  
    <meta name="keywords" content="面经,字节跳动,后端">
  

  
    <meta name="description" content="2021届秋招字节跳动正式批的一二三面过经">
  

  <!-- feed -->
  

  <!-- import meta -->
  

  <!-- link -->
  
    <link rel="shortcut icon" type='image/x-icon' href="https://halo-yayako.oss-cn-hangzhou.aliyuncs.com/icons8-lamb-96_1600147384617.png">
  

  <!-- import link -->
  

  
    
<link rel="stylesheet" href="/css/first.css">

  

  
  <link rel="stylesheet" href="/css/style.css" media="print" onload="this.media='all';this.onload=null">
  <noscript><link rel="stylesheet" href="/css/style.css"></noscript>
  

  <script id="loadcss"></script>

  

<script>if (/*@cc_on!@*/false || (!!window.MSInputMethodContext && !!document.documentMode)) document.write('\x3Cscript id="_iealwn_js" data-outver="11" src="https://support.dmeng.net/ie-alert-warning/latest.js">\x3C/script>'); </script>

</head>

  <body>
    

<header id="l_header" class="l_header always shadow blur "  >
  <div class='container'>
  <div id='wrapper'>
    <div class='nav-sub'>
      <p class="title"></p>
      <ul class='switcher nav-list-h m-phone' id="pjax-header-nav-list">
        <li><a id="s-comment" class="fas fa-comments fa-fw" target="_self" href='javascript:void(0)'></a></li>
        
          <li><a id="s-toc" class="s-toc fas fa-list fa-fw" target="_self" href='javascript:void(0)'></a></li>
        
      </ul>
    </div>
		<div class="nav-main">
      
        
        <a class="title flat-box" target="_self" href='/'>
          
            <img no-lazy class='logo' src='https://yayako-blog.oss-cn-hangzhou.aliyuncs.com/settings/icons8-doughnut-100.png'/>
          
          
          
        </a>
      

			<div class='menu navigation'>
				<ul class='nav-list-h m-pc'>
          
          
          
            
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/Java/
                  
                  
                  
                    id="categoriesJava"
                  >
                  Java
                </a>
                
                  <ul class="list-v">
                    
                      
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/Java/%E5%9F%BA%E7%A1%80/
                  
                  
                  
                    id="categoriesJavaE59FBAE7A180"
                  >
                  基础
                </a>
                
              </li>
            
          
                    
                      
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/Java/JVM/
                  
                  
                  
                    id="categoriesJavaJVM"
                  >
                  JVM
                </a>
                
              </li>
            
          
                    
                      
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/Java/J.U.C/
                  
                  
                  
                    id="categoriesJavaJUC"
                  >
                  J.U.C
                </a>
                
              </li>
            
          
                    
                  </ul>
                
              </li>
            
          
          
            
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/Golang/
                  
                  
                  
                    id="categoriesGolang"
                  >
                  Golang
                </a>
                
                  <ul class="list-v">
                    
                      
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/Golang/%E5%9F%BA%E7%A1%80
                  
                  
                  
                    id="categoriesGolangE59FBAE7A180"
                  >
                  基础
                </a>
                
              </li>
            
          
                    
                  </ul>
                
              </li>
            
          
          
            
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/%E6%A1%86%E6%9E%B6/
                  
                  
                  
                    id="categoriesE6A186E69EB6"
                  >
                  框架
                </a>
                
                  <ul class="list-v">
                    
                      
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/%E6%A1%86%E6%9E%B6/SSM/
                  
                  
                  
                    id="categoriesE6A186E69EB6SSM"
                  >
                  SSM
                </a>
                
              </li>
            
          
                    
                  </ul>
                
              </li>
            
          
          
            
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/%E4%B8%AD%E9%97%B4%E4%BB%B6/
                  
                  
                  
                    id="categoriesE4B8ADE997B4E4BBB6"
                  >
                  中间件
                </a>
                
                  <ul class="list-v">
                    
                      
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/%E4%B8%AD%E9%97%B4%E4%BB%B6/Redis/
                  
                  
                  
                    id="categoriesE4B8ADE997B4E4BBB6Redis"
                  >
                  Redis
                </a>
                
              </li>
            
          
                    
                  </ul>
                
              </li>
            
          
          
            
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/MySQL/
                  
                  
                  
                    id="categoriesMySQL"
                  >
                  MySQL
                </a>
                
                  <ul class="list-v">
                    
                      
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/MySQL/%E5%9F%BA%E7%A1%80/
                  
                  
                  
                    id="categoriesMySQLE59FBAE7A180"
                  >
                  基础
                </a>
                
              </li>
            
          
                    
                      
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/MySQL/InnoDB/
                  
                  
                  
                    id="categoriesMySQLInnoDB"
                  >
                  InnoDB
                </a>
                
              </li>
            
          
                    
                  </ul>
                
              </li>
            
          
          
            
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/%E7%AE%97%E6%B3%95/
                  
                  
                  
                    id="categoriesE7AE97E6B395"
                  >
                  算法
                </a>
                
                  <ul class="list-v">
                    
                      
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/%E7%AE%97%E6%B3%95/LeetCode/
                  
                  
                  
                    id="categoriesE7AE97E6B395LeetCode"
                  >
                  LeetCode
                </a>
                
              </li>
            
          
                    
                      
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/%E7%AE%97%E6%B3%95/%E5%89%91%E6%8C%87offer/
                  
                  
                  
                    id="categoriesE7AE97E6B395E58991E68C87offer"
                  >
                  剑指offer
                </a>
                
              </li>
            
          
                    
                  </ul>
                
              </li>
            
          
          
            
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/%E5%B7%A5%E5%85%B7/
                  
                  
                  
                    id="categoriesE5B7A5E585B7"
                  >
                  工具
                </a>
                
                  <ul class="list-v">
                    
                      
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/%E5%B7%A5%E5%85%B7/Linux/
                  
                  
                  
                    id="categoriesE5B7A5E585B7Linux"
                  >
                  Linux
                </a>
                
              </li>
            
          
                    
                      
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/%E5%B7%A5%E5%85%B7/Nginx/
                  
                  
                  
                    id="categoriesE5B7A5E585B7Nginx"
                  >
                  Nginx
                </a>
                
              </li>
            
          
                    
                      
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/%E5%B7%A5%E5%85%B7/Docker/
                  
                  
                  
                    id="categoriesE5B7A5E585B7Docker"
                  >
                  Docker
                </a>
                
              </li>
            
          
                    
                  </ul>
                
              </li>
            
          
          
            
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/%E5%85%B6%E4%BB%96/
                  
                  
                  
                    id="categoriesE585B6E4BB96"
                  >
                  其他
                </a>
                
                  <ul class="list-v">
                    
                      
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/%E5%85%B6%E4%BB%96/%E9%9D%A2%E7%BB%8F/
                  
                  
                  
                    id="categoriesE585B6E4BB96E99DA2E7BB8F"
                  >
                  面经
                </a>
                
              </li>
            
          
                    
                  </ul>
                
              </li>
            
          
          
				</ul>
			</div>

      <div class="m_search">
        <form name="searchform" class="form u-search-form">
          <i class="icon fas fa-search fa-fw"></i>
          <input type="text" class="input u-search-input" placeholder="Search..." />
        </form>
      </div>

			<ul class='switcher nav-list-h m-phone'>
				
					<li><a class="s-search fas fa-search fa-fw" target="_self" href='javascript:void(0)'></a></li>
				
				<li>
          <a class="s-menu fas fa-bars fa-fw" target="_self" href='javascript:void(0)'></a>
          <ul class="menu-phone list-v navigation white-box">
            
              
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/Java/
                  
                  
                  
                    id="categoriesJava"
                  >
                  Java
                </a>
                
                  <ul class="list-v">
                    
                      
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/Java/%E5%9F%BA%E7%A1%80/
                  
                  
                  
                    id="categoriesJavaE59FBAE7A180"
                  >
                  基础
                </a>
                
              </li>
            
          
                    
                      
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/Java/JVM/
                  
                  
                  
                    id="categoriesJavaJVM"
                  >
                  JVM
                </a>
                
              </li>
            
          
                    
                      
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/Java/J.U.C/
                  
                  
                  
                    id="categoriesJavaJUC"
                  >
                  J.U.C
                </a>
                
              </li>
            
          
                    
                  </ul>
                
              </li>
            
          
            
              
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/Golang/
                  
                  
                  
                    id="categoriesGolang"
                  >
                  Golang
                </a>
                
                  <ul class="list-v">
                    
                      
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/Golang/%E5%9F%BA%E7%A1%80
                  
                  
                  
                    id="categoriesGolangE59FBAE7A180"
                  >
                  基础
                </a>
                
              </li>
            
          
                    
                  </ul>
                
              </li>
            
          
            
              
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/%E6%A1%86%E6%9E%B6/
                  
                  
                  
                    id="categoriesE6A186E69EB6"
                  >
                  框架
                </a>
                
                  <ul class="list-v">
                    
                      
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/%E6%A1%86%E6%9E%B6/SSM/
                  
                  
                  
                    id="categoriesE6A186E69EB6SSM"
                  >
                  SSM
                </a>
                
              </li>
            
          
                    
                  </ul>
                
              </li>
            
          
            
              
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/%E4%B8%AD%E9%97%B4%E4%BB%B6/
                  
                  
                  
                    id="categoriesE4B8ADE997B4E4BBB6"
                  >
                  中间件
                </a>
                
                  <ul class="list-v">
                    
                      
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/%E4%B8%AD%E9%97%B4%E4%BB%B6/Redis/
                  
                  
                  
                    id="categoriesE4B8ADE997B4E4BBB6Redis"
                  >
                  Redis
                </a>
                
              </li>
            
          
                    
                  </ul>
                
              </li>
            
          
            
              
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/MySQL/
                  
                  
                  
                    id="categoriesMySQL"
                  >
                  MySQL
                </a>
                
                  <ul class="list-v">
                    
                      
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/MySQL/%E5%9F%BA%E7%A1%80/
                  
                  
                  
                    id="categoriesMySQLE59FBAE7A180"
                  >
                  基础
                </a>
                
              </li>
            
          
                    
                      
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/MySQL/InnoDB/
                  
                  
                  
                    id="categoriesMySQLInnoDB"
                  >
                  InnoDB
                </a>
                
              </li>
            
          
                    
                  </ul>
                
              </li>
            
          
            
              
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/%E7%AE%97%E6%B3%95/
                  
                  
                  
                    id="categoriesE7AE97E6B395"
                  >
                  算法
                </a>
                
                  <ul class="list-v">
                    
                      
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/%E7%AE%97%E6%B3%95/LeetCode/
                  
                  
                  
                    id="categoriesE7AE97E6B395LeetCode"
                  >
                  LeetCode
                </a>
                
              </li>
            
          
                    
                      
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/%E7%AE%97%E6%B3%95/%E5%89%91%E6%8C%87offer/
                  
                  
                  
                    id="categoriesE7AE97E6B395E58991E68C87offer"
                  >
                  剑指offer
                </a>
                
              </li>
            
          
                    
                  </ul>
                
              </li>
            
          
            
              
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/%E5%B7%A5%E5%85%B7/
                  
                  
                  
                    id="categoriesE5B7A5E585B7"
                  >
                  工具
                </a>
                
                  <ul class="list-v">
                    
                      
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/%E5%B7%A5%E5%85%B7/Linux/
                  
                  
                  
                    id="categoriesE5B7A5E585B7Linux"
                  >
                  Linux
                </a>
                
              </li>
            
          
                    
                      
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/%E5%B7%A5%E5%85%B7/Nginx/
                  
                  
                  
                    id="categoriesE5B7A5E585B7Nginx"
                  >
                  Nginx
                </a>
                
              </li>
            
          
                    
                      
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/%E5%B7%A5%E5%85%B7/Docker/
                  
                  
                  
                    id="categoriesE5B7A5E585B7Docker"
                  >
                  Docker
                </a>
                
              </li>
            
          
                    
                  </ul>
                
              </li>
            
          
            
              
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/%E5%85%B6%E4%BB%96/
                  
                  
                  
                    id="categoriesE585B6E4BB96"
                  >
                  其他
                </a>
                
                  <ul class="list-v">
                    
                      
            
              <li>
                <a class="menuitem flat-box faa-parent animated-hover" href=/categories/%E5%85%B6%E4%BB%96/%E9%9D%A2%E7%BB%8F/
                  
                  
                  
                    id="categoriesE585B6E4BB96E99DA2E7BB8F"
                  >
                  面经
                </a>
                
              </li>
            
          
                    
                  </ul>
                
              </li>
            
          
            
          </ul>
        </li>
			</ul>
		</div>
	</div>
  </div>
</header>

    <div id="l_body">
      <div id="l_cover">
  
    
        <div id="half" class='cover-wrapper post search' style="display: ;">
          
            <div id='cover-backstretch'></div>
          
          <div class='cover-body'>
  <div class='top'>
    
    
      <p class="title">Yayako's Blog</p>
    
    
      <p class="subtitle">「Shooting for the stars when I couldn't make a killing.」</p>
    
  </div>
  <div class='bottom'>
    
      <div class="m_search">
        <form name="searchform" class="form u-search-form">
          <input type="text" class="input u-search-input" placeholder="Have a nice day!" />
          <i class="icon fas fa-search fa-fw"></i>
        </form>
      </div>
    
    <div class='menu navigation'>
      <div class='list-h'>
        
          
            <a href="/"
              
              
              id="home">
              <i class='fas fa-home fa-fw'></i><p>首页</p>
            </a>
          
            <a href="/categories/"
              
              
              id="categories">
              <i class='fas fa-folder-open fa-fw'></i><p>分类</p>
            </a>
          
            <a href="/archives/"
              
              
              id="archives">
              <i class='fas fa-archive fa-fw'></i><p>归档</p>
            </a>
          
            <a href="/tags/"
              
              
              id="tags">
              <i class='fas fa-tags fa-fw'></i><p>标签</p>
            </a>
          
            <a href="/friends/"
              
              
              id="friends">
              <i class='fas fa-link fa-fw'></i><p>友链</p>
            </a>
          
            <a href="/about/"
              
              
              id="about">
              <i class='fas fa-user fa-fw'></i><p>关于</p>
            </a>
          
        
      </div>
    </div>
  </div>
</div>

          <div id="scroll-down" style="display: none;"><i class="fa fa-chevron-down scroll-down-effects"></i></div>
        </div>
    
  
  </div>

      <div id="safearea">
        <div class="body-wrapper" id="pjax-container">
          

<div class='l_main'>
  <article class="article post white-box reveal md shadow article-type-post" id="post" itemscope itemprop="blogPost">
  


  
  <div class="article-meta" id="top">
    
    
    
      <h1 class="title">
        字节跳动-深圳Data-后台工程师-一二三面
      </h1>
      <div class='new-meta-box'>
        
          
            
<div class='new-meta-item author'>
  <a class='author' href="/about" rel="nofollow">
    <img no-lazy src="https://yayako-blog.oss-cn-hangzhou.aliyuncs.com/settings/icons8-cat-100%20%282%29.png">
    <p>yayako</p>
  </a>
</div>

          
        
          
            <div class="new-meta-item date">
  <a class='notlink'>
    <i class="fas fa-calendar-alt fa-fw" aria-hidden="true"></i>
    <p>发布于：2020年8月26日</p>
  </a>
</div>

          
        
          
            
  <div class="new-meta-item browse leancloud">
    <a class='notlink'>
      
      <div id="lc-pv" data-title="字节跳动-深圳Data-后台工程师-一二三面" data-path="/2020/08/26/%E5%AD%97%E8%8A%82%E8%B7%B3%E5%8A%A8-%E6%B7%B1%E5%9C%B3Data-%E5%90%8E%E5%8F%B0%E5%B7%A5%E7%A8%8B%E5%B8%88-%E4%B8%80%E4%BA%8C%E4%B8%89%E9%9D%A2/">
        <i class="fas fa-eye fa-fw" aria-hidden="true"></i>
        <span id='number'><i class="fas fa-circle-notch fa-spin fa-fw" aria-hidden="true"></i></span>
        次浏览
      </div>
    </a>
  </div>


          
        
          
            
<div class="new-meta-item comments-count">
  
  <a href="/2020/08/26/%E5%AD%97%E8%8A%82%E8%B7%B3%E5%8A%A8-%E6%B7%B1%E5%9C%B3Data-%E5%90%8E%E5%8F%B0%E5%B7%A5%E7%A8%8B%E5%B8%88-%E4%B8%80%E4%BA%8C%E4%B8%89%E9%9D%A2/#comments">
    <i class="fas fa-comment-dots fa-fw"></i>
    <span class="valine-comment-count" data-xid="/2020/08/26/%E5%AD%97%E8%8A%82%E8%B7%B3%E5%8A%A8-%E6%B7%B1%E5%9C%B3Data-%E5%90%8E%E5%8F%B0%E5%B7%A5%E7%A8%8B%E5%B8%88-%E4%B8%80%E4%BA%8C%E4%B8%89%E9%9D%A2/">0</span>
    <span class="leancloud-comments-count">&nbsp;条评论</span>
  </a>
</div>


          
        
      </div>
    
  </div>


  
  
  <p>牛客主页：<a target="_blank" rel="noopener" href="https://www.nowcoder.com/profile/785377050/myDiscussPost">今天也是没有收到offer的一天</a></p>
<h2 id="一面-2020-08-19-19：30-20：30"><a href="#一面-2020-08-19-19：30-20：30" class="headerlink" title="一面 2020-08-19 19：30 - 20：30"></a>一面 2020-08-19 19：30 - 20：30</h2><p><strong>1. 自我介绍</strong></p>
<p><strong>2. 类的生命周期</strong><br>（我在字节终于被问了Java基础，天啦噜）</p>
<p>加载 -&gt; 验证（符合规范约束，不会对虚拟机有危害）-&gt; 准备（类变量/静态变量赋零值，静态常量赋初始值）-&gt; 解析（符号引用替换直接引用）-&gt; 初始化（类变量赋初始值blablabla） -&gt; 使用 -&gt; 卸载</p>
<p><strong>3. 符号引用和直接引用</strong><br>果然给自己挖了坑，我说符号引用可以是任何形式的字面量，与内存布局无关，加载的时候拼接（这里有问题）起来能定位到目标对象；直接引用就相当于直接指向目标的指针，与内存布局有关。</p>
<p>面试官表示不理解，要我再讲一下符号引用，我之前看过公开课讲过符号引用转变为直接引用的过程，但是印象不深了，就说他是常量池里通过指令后有个什么指向什么的说乱了，最后坦白说我自己也有点乱就先过了。 <strong>有大佬跟我讲一下这个吗？</strong></p>
<p><strong>4. 类加载机制？这么设计的好处？怎么实现打破？</strong><br>昨天网易二面刚问过类加载模型，我就把双亲委派和哪几种类加载器都说了。</p>
<p>好处是一个安全（防止用户自定义的类覆盖基础类），一个防止类被重复加载。</p>
<p>打破我说的是线程上下文类加载器，就是引入线程上下文类加载器（通过 Thread 类的setContextClassLoader()方法设置类加载器），通过父类加载器去请求子类加载器来完成类的加载。不过我只记得是叫线程上下文类加载了，忘了是通过设置类加载器来打破，所以面试官就问我说这难道不是一种新的类加载器吗，我说不是，只是在加载的时候可以通过他来改变，面试官表示不解，我表示忘了。于是过。</p>
<p><strong>5. 你们都是使用的spring框架是吧，讲讲框架初始化的过程吧</strong><br>我表示自己只看过bean加载和aop的源码（实际上事务管理也看了，但我忘得差不多了不敢挖坑），于是就说能不能讲bean加载的过程，表示ok。于是就把bean加载的整个主要的流程说了一通</p>
<p>解析beanname=》单例池找单例（三层缓存）=》单例bean的创建=》记录加载状态（放进map）=》实例化前置处理（BeanPostProcessor接口，顺便说了下aop的代理加强就是在这里判断实现的，有个aop的BeanPostProcessor）=》提前曝光（三个条件：单例 + allowEarlyReference + 正在加载中，都成立就提前曝光自己的ObjectFactory放到第三层缓存里）=》属性填充（讲了下循环依赖）=》移除加载状态（从map里去掉）</p>
<p>其实还有根据构造器构造的部分，我记不清了就没提，避免挖坑（</p>
<p><strong>6. spring怎么选代理方式？</strong><br>实现接口默认jdk动态代理，没有实现默认cglib，前者通过实现类，后者通过继承，也可以通过proxy-class-target来指定使用cglib。然后他好像想接着问的，不过还是说过了，可能是想挖深一点吧。</p>
<p><strong>7. 数据库的隔离级别d</strong><br>读未提交（脏读），读已提交（不可重复读），可重复读（幻读），串行化。</p>
<p>这里有点好玩，实际上幻读我一开始说的是【幻行】，然后他就问我【幻行】是什么，我一下子没反应过来，就说是一个事务内两次select多出了不存在的行，他说噢【幻读】啊，然后我才反应过来，说噢噢噢【幻读】是一种现象，【幻行】就是多出来的行hhh</p>
<p><strong>8. 怎么做到可重复读？</strong></p>
<p>我说可以通过mvcc来解决，以及mvcc在可重复读下可以 <strong>优化</strong>幻读问题。 <strong>请注意：RR级别下不能完美解决幻读问题哈，mvcc也不行，</strong> 也别跟我说next-key算法，手动加锁那算是存储引擎自己主动干的事吗，不算！毕竟 飞书一面被面试官质疑过，写过<a target="_blank" rel="noopener" href="https://yayako.cn/archives/%E9%9D%A2%E8%AF%95%E5%A4%8D%E7%9B%98%E4%B9%8Brr%E7%BA%A7%E5%88%AB%E4%B8%8B%E8%83%BD%E8%A7%A3%E5%86%B3%E5%B9%BB%E8%AF%BB%E9%97%AE%E9%A2%98%E9%82%A3%E4%B8%BA%E4%BB%80%E4%B9%88%E4%B8%8D%E5%8F%AB%E5%B9%BB%E8%AF%BB%E7%BA%A7%E5%88%AB">博客</a>，可以参考，不过写的不咋好哈，随手记录罢了。</p>
<p>然后就讲了mvcc的原理，讲了两个隐藏列，事务id和指向undo log的指针： 事务A快照读后，事务B启动并提交了insert操作，这个时候这条记录的事务id指向事务B，事务A再执行快照读时不会把它纳入结果，因为事务B的id大于事务A的id，根据undo log回滚发现这条记录他本就不存在。但是如果此时事务A执行的操作比如说update覆盖到了这条insert的记录，那这条记录的事务id就会指向事务A，此时事务A再次执行快照读的时候就会发生幻读现象了。</p>
<p>==手动分割线：下面<strong>9、11、12、13</strong>的回答是有问题的，题目本身我记得也不清楚了，就不说自己的回答了，当然了看客们知道的能不能留下正解 （拜托啦这对我真的很重要==</p>
<p><strong>9. update操作不会判断事务指针吗？</strong><br>​ 说了不会，实际上这里我也有点疑惑，挖个坑好了，之前一个小伙伴跟我说是update是会执行当前都然后上写锁，我觉得有点不对劲，<strong>待解决。</strong></p>
<p><strong>10. undo log是用来做什么的？事务提交的时候会提交什么日志？</strong></p>
<p><strong>11. redo和bin的提交顺序呢？</strong></p>
<p><strong>12. undo log 和 redo log的区别？分别记录了什么？binlog呢？</strong><br>​ undo log是存储引擎层的日志，是一种逻辑日志，记录的可以说是一个反逻辑的sql；binlog是数据库层次的日志，记录了对数据库增删改的sql；redo log也是存储引擎层的日志，但是是物理日志，然后记录了什么我一下子忘了就说了不知道，实际上应该是记录了对数据页的修改吗？</p>
<p><strong>13. 数据库会把数据持久化到磁盘为什么还要redo log来做持久化？</strong><br>​ 这个其实是我前面的表述问题，redo log是做事务持久化的，是我没注意到。</p>
<p><strong>14. 算法</strong><br>​ 力扣原题：<a target="_blank" rel="noopener" href="https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/">82.删除排序链表中的重复元素II</a>，我以为我做过的，实际上搜到的时候现显示没有提交记录（？</p>
<p>一开始想一次遍历来做，发现总是绕不开，就改用递归了，跟面试官先说了思路后写了主要逻辑，然后通过。</p>
<p>中间有两个小插曲，一个是一开始编译总是过不去显示非法字符，我以为是输入输出有问题，最后面试官提醒我说你用了中文的分号</p>
<p>还有一个是可能一开始hr没沟通好，我做题做到一般面试官突然下线然后二面面试官上来了，跟我说你是来应聘后端开发工程师的吧blablabla，我说是，然后我说我有个问题：我刚刚才面试到一半，还在做题呢</p>
<p><strong>15. 反问</strong><br>万年不变的问您觉得这里的工作氛围如何？</p>
<p> 面试官说突然问这么广啊，我觉得还好吧就互联网公司嘛，身边年轻人也挺多的，压力也挺大，每天有做不完的需求</p>
<p><strong>问题补充：</strong></p>
<p><strong>你刚刚说的是单例bean是吧，spring还有那些bean？</strong><br>proptotype，request，session，global-session。然后说了原型bean就是每次都生成一个新的bean实例。</p>
<p><strong>request bean和session bean有什么区别？</strong><br>我就说了request是一次http请求就会创建一个，session也是，然后面试官说这不是一样吗，我也没了解过，于是这个问题过了。</p>
<h2 id="二面-2020-08-19-20：30-21：30"><a href="#二面-2020-08-19-20：30-21：30" class="headerlink" title="二面 2020-08-19 20：30 - 21：30"></a>二面 2020-08-19 20：30 - 21：30</h2><p>解释了下刚刚提前上线的情况，然后说我们重新认识一下2333<br>二面真的记不清了，比较基础的题我也就不详细写了哈。</p>
<p><strong>1. 自我介绍</strong></p>
<p><strong>2. 你们这个灭菌器的项目有多少人会使用的？</strong><br>我说这还不清楚，还没上线。<br>​ 然后问我说你们本科就有导师的嘛，有自己的实验室嘛？我说是，不过我们就是普通的工作室。（因为我有三个跟导师的项目（其实都是crud（小声bb</p>
<p> <strong>3. 不知道的情况下就使用了redis嘛？</strong><br>​ （因为！要！写进简历里的嘛！（内心os</p>
<p> 因为灭菌器他有很多的一些固定的参数，是不会修改的，所以走了redis</p>
<p> <strong>4. 有考虑过使用其他的，比如使用配置文件来存储吗？</strong><br>​ 没有（也没太懂？</p>
<p> <strong>5. 缓存更新是怎么更新的呢？</strong><br>​ 先写库后删缓存，读的时候先读缓存没有就读库然后更新（这里我只是说了我项目里怎么做的，因为没有需要实现强一致性</p>
<p> <strong>6. redis的数据是存储在哪里的？</strong> 内存，也可以持久化到磁盘。 <strong>持久化方式？</strong> rdb快照，aof日志。</p>
<p> <strong>7. 知道redis的主从选举嘛？</strong><br>​ 我说我只知道主从的原理，就讲了主从复制的原理过程。旧版的sync和新版的psync，完整重同步和部分重同步。</p>
<p> <strong>8. 有使用过redis的过期时间吗？怎么实现的？</strong><br>​ 我说我简单使用过，然后我以为他是要我说实现的原理，就说了不知道，他就说如果让我实现我会怎么实现，我说会设置定时器，然后优化不出来就过了。</p>
<p> 最后我才知道原来他问的其实就是删除策略，也就是惰性删除和定期删除， 不是原理，可惜了。</p>
<p> <strong>9. 知道sql注入嘛？怎么解决的呢？</strong><br>​ 讲了讲字符串拼接的sql，举了用户登录的例子。然后说mybatis的preparestatement可以解决，也就是通过预编译语句。</p>
<p> <strong>10. 软件专业学过计网的吧，说说tcp和udp的区别？哪一层的协议？我们现在面试用的哪个？http用的哪个？</strong></p>
<p> <strong>11. tcp提到了流量控制和拥塞控制，说说区别？</strong><br>​ 流量控制是一对一，防止发送方发的太快接收方来不及接受；拥塞控制是全局，防止过多数据注入网络导致网络拥塞。<br>​<br>​ <strong>12. 滑动窗口知道吧，讲讲滑动窗口？拥塞控制的四个算法知道吧，讲讲四个算法？</strong><br>​ （说到后面自己有点口胡哈哈哈哈，面试官说没关系他知道我知道了。</p>
<p> <strong>13. 输入url回车经历了哪些过程？</strong><br>​ 简单记录一下，浏览器解析域名=》dns服务器找ip地址（递归or迭代）=》传输层tcp三次握手建立请求=》发送http报文=》接收报文给浏览器渲染</p>
<p> <strong>14. 知道浏览器怎么渲染的嘛？</strong><br>​ 不知道呀</p>
<p> <strong>15. 计网过了，问问os吧，知道堆栈嘛？</strong><br>​ 我说我可以从Java的角度来讲吗，就说了堆线程共享，栈线程私有（这和Java角度有什么关系啊喂）。然后问我进程之间共享嘛？我说不共享来着。</p>
<p> <strong>16.知道虚拟内存和常驻内存嘛？</strong><br>​ 我说我知道虚拟内存，就举了个例子来说明虚拟内存，提了下调页和缺页中断。</p>
<p> <strong>17. 调页算法有哪些呢？</strong><br>​ lru，lfu，fifo，理想化的opt。</p>
<p> <strong>18. os过了，我看你经历挺丰富的，没参加过算法竞赛吗？</strong><br>​ 无，我今年才开始学的算法。面试官说数据结构与算法不是应该大二就学了嘛？我说我们大二只学了数据结构，算法是后面的选修课2333</p>
<p> <strong>19. 那你知道常用的算法吗？</strong><br>​ 然后挨个问我知道链表吗，知道双向链表吗，知道树吗（我内心os：这不是数据结构嘛；<br>​ 然后问我知道完全二叉树吗，我说知道，但是一下子不知道怎么描述，语废啊我，然后他就在共享屏幕给我手打让我判断了；<br>​ 然后问我知道图吗？我说简单用过，果不其然他就带着【dijkstra】来了，实话实说真的忘了；<br>​ 然后问我知道大顶堆吗？我说知道，他就给我打了一个大顶堆的图，问我弹出最大值后会怎么做，毕竟是手写过大顶堆的人，我凭着记忆说把最小值和最大值互换，最大值取null，堆顶的最小值下沉。然后他问我如果不是完全二叉树怎么办，没理解，重新画了个情况，就是把同层的两个节点互换了下位置，我说我记得他下沉的时候会跟同层的兄弟节点做判断，具体忘了（就这你也敢说自己手写过大顶堆？<br>​<br>​ <strong>20. 那我们来写道题吧？</strong><br>​ （说出来你可能不信，是力扣第一题</p>
<p> <strong>力扣<a target="_blank" rel="noopener" href="https://leetcode-cn.com/problems/two-sum/">1.两数之和</a></strong> 不过面试官只要求我返回存在情况的个数。<br>​ 其实一开始没想法的，说了可以通过set存储然后遍历，然后他说可以不用额外空间嘛，想了会儿我说可以预排序然后用双指针。他说对，然后写了核心代码。</p>
<p><strong>提升，如果是三数之和呢？也有原题 力扣<a target="_blank" rel="noopener" href="https://leetcode-cn.com/problems/3sum/">15.三数之和</a></strong> 不过面试官的题是无重复数组<br>我说加个循环，最外层指针做for循环遍历，每层还是双指针，问了时间复杂度，我说nlogn。</p>
<p><strong>提升，如果有重复数组呢？</strong><br>​我纸上画了下说让两个指针移动的时候跳过重复的就好了，最后大概是时间还充裕就让我把这版代码也写了。中间有点空指针的bug，也改出来了<br>​<br><strong>提升，如果是k数之和呢？不用写，直接说思路就好，</strong><br>没啥思路，面试官就提示我了，问我说一个数组的全排列会做吗，我就说了回溯，然后就说噢这题就可以回溯，回溯的时候判断就好。还好没让写，毕竟我写回溯很容易出错hhh。</p>
<p> <strong>21. 反问</strong><br>​ 其实我也没什么想问的，就像征信的问问常见问题。</p>
<p> <strong>Q：</strong> 部门用的python和go吧，如果通过的话需要学些什么框架呢？<br>​ <strong>A：</strong> 列举了诸多框架，还讲了字节自己的一个框架，说如果想学的话可以去找开源的gin。<br>​ <strong>Q：</strong> 有什么个人建议吗？<br>​ <strong>A（笑着说）：</strong> 我只是个面试的，不好给你提建议啊。<br>​ <strong>Q：</strong> 那有什么学习方法推荐吗？<br>​ <strong>A：</strong> 这个每个人的学习方法都是不同的，有的人喜欢看书，有的人喜欢看博客。<br>​ <strong>Q：</strong> 好了没问题了，辛苦您了！</p>
<p>隔天收到hr电话约了三面</p>
<h2 id="三面-2020-08-26"><a href="#三面-2020-08-26" class="headerlink" title="三面 2020-08-26"></a>三面 2020-08-26</h2><p><strong>1. 面试官的自我介绍 + 我的自我介绍</strong></p>
<p><strong>2. 看你项目经历也挺丰富了，挑一个项目讲讲？</strong><br>还是讲了线程池批量处理字段的问题。紧接着，<br>为什么用线程池？单线程处理超时了。<br>参数怎么配置的？线程池核心参数。<br>为什么io操作就用2n？参考的其他博客和书本。<br>有没有比较过不使用2n线程数的时间？没有。<br>如果是大文件怎么处理？可以采取分片。<br>分片要交给用户来做吗？可以后台异步处理，再通知用户。<br>用户可以看到状态吗？应该可以。</p>
<p>然后扯了下spring的@Asyn大概做了啥，最后我说这我只是知道能这么做，具体没做过。</p>
<p><strong>闲聊：</strong><br>面试官：我看你在这里也面了很多次了，前面的面试官给你的面评也都不错。<br>我（疯狂摇头）：那你不会就要问我难的了吧。<br>面试官：不会不会。<br>我的内心：我这才六面，我都见过面字节有十几面的人了。</p>
<p><strong>3. （看着我之前的面经）讲讲rsa？用来做什么？为什么用非对称加密？</strong><br>看过我之前面经的应该知道我飞书二面被问过rsa，和非对称加密。<br>但是当时我的没有去好好复盘，所以只说了我在实习经历里用过rsa，具体实现还是没有去了解，以为密码学的东西算很难。面试官说其实不用去了解算法的实现，重在了解他的作用、使用场景就好了。</p>
<p><strong>4. 挑个你最擅长的模块讲讲？</strong> 我沉思，沉思，沉思，不知道。就说了存储引擎。 <strong>了解什么存储引擎？适用的场景？</strong></p>
<p>讲了下memory和还有一个忘了叫什么，是基于内存的，然后还有常用的innodb和myisam，应用场景没说出来，只说了myisam不支持事务操作所以相应的场景不适用。</p>
<p>这个问题已经复盘，参考另一篇<a target="_blank" rel="noopener" href="https://yayako.cn/archives/%E9%9D%A2%E8%AF%95%E5%A4%8D%E7%9B%98%E4%B9%8B%E5%AD%98%E5%82%A8%E5%BC%95%E6%93%8E%E9%80%82%E7%94%A8%E5%9C%BA%E6%99%AF%E7%9A%84%E6%80%9D%E8%80%83%E4%BB%8E%E5%8C%BA%E5%88%AB%E5%88%B0%E4%BD%9C%E7%94%A8%E5%88%B0%E5%9C%BA%E6%99%AF">博客</a></p>
<p>面试官（笑）：那你选存储引擎干啥呀<br>我（笑）：那你问我innodb里的一些机制我还是知道的（自己存在的问题暴露的越来越明显</p>
<p><strong>5.</strong> <strong>innodb存储数据的结构（貌似是这个问题，有点忘了）</strong><br>应该是飞书三面的问题。把自己坑的不行。</p>
<p><strong>6. 然后接连问了下索引分类？聚簇索引只能有一个吗？</strong><br>这里我跟面试官说的开始自相矛盾了，说出来丢人，比如我把聚簇索引和非聚簇索引说成了辅助索引和非辅助索引，把b+树说成了二叉树（虽然改正了，还是抽自己</p>
<p><strong>7. 还是场景题，微信扫码登录，如果让我来设计我会怎么设计？</strong><br>我说一个二维码对应一个url，客户端扫完之后带着参数重定向到该url，然后服务端收到请求后验证用户信息再进行后续处理。</p>
<p>中间提到服务端是怎么知道二维码被扫了，我一开始是说定时任务扫表查看二维码的状态，后面说直接在客户端请求到了后处理二维码就好了。</p>
<p>然后提到一个二维码他需要携带什么参数，我只说出了url和过期时间。</p>
<p>不知道，还有啥。</p>
<p><strong>8. 最后一个，分布式id怎么生成？</strong> 雪花算法。 <strong>流水号怎么生成？</strong><br>面试官：这个其实我不是想考你技术点，这个id在最开始生成一批直接用就好了。</p>
<p><strong>9. 算法</strong><br>面试官（看着我的面经）：我看你面经，这次就不出逻辑题了吧，出算法。<br>我（笑中带泪）</p>
<figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">输入是一个分数a/b，b&gt;a&gt;0。</span><br><span class="line">输出这个分数对应的小数形式循环小数用括号把循环节括起来</span><br><span class="line">1 / 4 = 0.25</span><br><span class="line">1 / 3 = 0.(3)</span><br><span class="line">1 / 6 = 0.1(6)</span><br><span class="line">1 / 7 = 0.(142857)</span><br></pre></td></tr></table></figure>
<p>有点坎坷但还是做出来了，中间循环节没想到怎么判断，面试官提醒了一下就有思路了（判断被除数就好，我一开始还想着从字符串入手，难为自己）。</p>
<p>面试官：你觉得这道题难吗<br>我：难是不难，但还是要想到才行，比如这个循环节我一开始就想的用字符串，就不好处理</p>
<p><strong>10. 反问</strong><br>Q：个人建议<br>A：你对你自己的自我评价呢<br>Q：实话实说，我倒着来，就从算法来说，我的习惯是一边写代码，一边处理边界， 所以写的时候会改来改去，但是这是一开始就要设计好的，这点不好；我自己的场景处理能力不好；我学一些东西的时候感觉是用什么学什么，没有去考虑一些东西的实际应用场景之类的问题，这样也很不好。<br>A：我看过你之前的面评，结合这次的，你基础可以，编码能力也不错（我：疯狂摇头×2，真的你问我深一点我绝对不会），但是我有点担心你（“担心”这句，真的是原话），就是你好像会倾向于是去死记一些知识点，所以我这次面试都没有问你一些知识点的问题。<br>Q：是的，我最近面试感触很深。那您有什么建议吗，就是应该怎么学？<br>A：就是在学习的时候，要多思考，不要死记，还要去考虑这个东西有什么用，适合在什么场景用。拿RSA举例，要知道他是做什么的，适合用在哪里。</p>
<p> ps：其实面试官跟我讲的比较细，我描述的比较概括，大体意思能get就好。</p>
<p><strong>最后</strong><br>面试官：我看你博客，好久没发算法打卡了，是没做了吗？<br>我：不是不是不是，我还有天天做力扣的每日一题打卡，但是这个博客的框架太慢了，就懒得发了（我之前用的wordpress）</p>
<p><strong>个人复盘/碎碎念：</strong>其实面试官指出来的问题我自己很明确，应试型选手嘛，我网易二面下来就很清楚自己现在最大的问题了。面完回寝室的路上就在思考自己的这个问题，我从小到大就是典型的应试型选手，典型的“死”努力派，初中的时候就意识到了这个问题，但是没有去改变，高中的时候自己的座右铭是“努力不一定会成功，不努力一定不会成功”，终于挫败接踵而至。唉，碰到问题不要逃避啊，但是还是有点迷茫。之前有牛油跟我讲过应该要有结构性的思维去看问题，跟我发了很多很多，我超级感谢他只不过这种思维方式的养成还需要我继续琢磨吧。</p>
<p> 以及， <strong>字节很重视复盘的（听到没有，都给我去复盘！！！）</strong>，我前两面的复盘了，飞书那波确实 没有复盘，给自己挖了很大的坑，俺活该</p>
<p>一周后收到oc，再隔天收到意向书🎉</p>

  
  
    
    <div class='footer'>
      
      
      
        <div class='copyright'>
          <blockquote>
            
              
                <p>博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议</p>

              
            
              
                <p>本文永久链接是：<a href=https://www.yayako.cn/2020/08/26/%E5%AD%97%E8%8A%82%E8%B7%B3%E5%8A%A8-%E6%B7%B1%E5%9C%B3Data-%E5%90%8E%E5%8F%B0%E5%B7%A5%E7%A8%8B%E5%B8%88-%E4%B8%80%E4%BA%8C%E4%B8%89%E9%9D%A2/>https://www.yayako.cn/2020/08/26/%E5%AD%97%E8%8A%82%E8%B7%B3%E5%8A%A8-%E6%B7%B1%E5%9C%B3Data-%E5%90%8E%E5%8F%B0%E5%B7%A5%E7%A8%8B%E5%B8%88-%E4%B8%80%E4%BA%8C%E4%B8%89%E9%9D%A2/</a></p>
              
            
          </blockquote>
        </div>
      
      
    </div>
  
  
    


  <div class='article-meta' id="bottom">
    <div class='new-meta-box'>
      
        
          <div class="new-meta-item date" itemprop="dateUpdated" datetime="2021-01-22T16:05:42+08:00">
  <a class='notlink'>
    <i class="fas fa-edit fa-fw" aria-hidden="true"></i>
    <p>更新于：2021年1月22日</p>
  </a>
</div>

        
      
        
          
  
  <div class="new-meta-item meta-tags"><a class="tag" href="/tags/%E9%9D%A2%E7%BB%8F/" rel="nofollow"><i class="fas fa-hashtag fa-fw" aria-hidden="true"></i><p>面经</p></a></div> <div class="new-meta-item meta-tags"><a class="tag" href="/tags/%E5%AD%97%E8%8A%82%E8%B7%B3%E5%8A%A8/" rel="nofollow"><i class="fas fa-hashtag fa-fw" aria-hidden="true"></i><p>字节跳动</p></a></div> <div class="new-meta-item meta-tags"><a class="tag" href="/tags/%E5%90%8E%E7%AB%AF/" rel="nofollow"><i class="fas fa-hashtag fa-fw" aria-hidden="true"></i><p>后端</p></a></div>


        
      
        
          
  <div class="new-meta-item share -mob-share-list">
  <div class="-mob-share-list share-body">
    
      
        <a class="-mob-share-qq" title="" rel="external nofollow noopener noreferrer noopener"
          
          target="_blank" href="http://connect.qq.com/widget/shareqq/index.html?url=https://www.yayako.cn/2020/08/26/%E5%AD%97%E8%8A%82%E8%B7%B3%E5%8A%A8-%E6%B7%B1%E5%9C%B3Data-%E5%90%8E%E5%8F%B0%E5%B7%A5%E7%A8%8B%E5%B8%88-%E4%B8%80%E4%BA%8C%E4%B8%89%E9%9D%A2/&title=字节跳动-深圳Data-后台工程师-一二三面 - Yayako's Blog&summary=2021届秋招字节跳动正式批的一二三面过经"
          
          >
          
            <img src="https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/logo/128/qq.png" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/logo/128/qq.png" srcset="">
          
        </a>
      
    
      
        <a class="-mob-share-qzone" title="" rel="external nofollow noopener noreferrer noopener"
          
          target="_blank" href="https://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url=https://www.yayako.cn/2020/08/26/%E5%AD%97%E8%8A%82%E8%B7%B3%E5%8A%A8-%E6%B7%B1%E5%9C%B3Data-%E5%90%8E%E5%8F%B0%E5%B7%A5%E7%A8%8B%E5%B8%88-%E4%B8%80%E4%BA%8C%E4%B8%89%E9%9D%A2/&title=字节跳动-深圳Data-后台工程师-一二三面 - Yayako's Blog&summary=2021届秋招字节跳动正式批的一二三面过经"
          
          >
          
            <img src="https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/logo/128/qzone.png" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/logo/128/qzone.png" srcset="">
          
        </a>
      
    
      
        <a class="-mob-share-weibo" title="" rel="external nofollow noopener noreferrer noopener"
          
          target="_blank" href="http://service.weibo.com/share/share.php?url=https://www.yayako.cn/2020/08/26/%E5%AD%97%E8%8A%82%E8%B7%B3%E5%8A%A8-%E6%B7%B1%E5%9C%B3Data-%E5%90%8E%E5%8F%B0%E5%B7%A5%E7%A8%8B%E5%B8%88-%E4%B8%80%E4%BA%8C%E4%B8%89%E9%9D%A2/&title=字节跳动-深圳Data-后台工程师-一二三面 - Yayako's Blog&summary=2021届秋招字节跳动正式批的一二三面过经"
          
          >
          
            <img src="https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/logo/128/weibo.png" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/logo/128/weibo.png" srcset="">
          
        </a>
      
    
      
    
      
    
  </div>
</div>



        
      
    </div>
  </div>


  
  

  
    <div class="prev-next">
      
        <a class='prev' href='/2020/09/03/%E9%9D%A2%E7%BB%8F%E5%A4%8D%E7%9B%98%E4%B9%8B%E3%80%8C%E5%AD%98%E5%82%A8%E5%BC%95%E6%93%8E%E9%80%82%E7%94%A8%E5%9C%BA%E6%99%AF%E3%80%8D%E7%9A%84%E6%80%9D%E8%80%83%E2%80%94%E2%80%94%E4%BB%8E%E2%80%9C%E5%8C%BA%E5%88%AB%E2%80%9D%E5%88%B0%E2%80%9C%E4%BD%9C%E7%94%A8%E2%80%9D%E5%88%B0%E2%80%9C%E5%9C%BA%E6%99%AF%E2%80%9D/'>
          <p class='title'><i class="fas fa-chevron-left" aria-hidden="true"></i>面经复盘之「存储引擎适用场景」的思考——从“区别”到“作用”到“场景”</p>
          <p class='content'>通常会以「区别」作为引子：InnoDB和MyISAM的区别是什么？
应试选手发言：

简单来说，相较于InnoDB而言，MyISAM不支持事务，不支持行锁，不支持外键（等等）。

然后发问：那他...</p>
        </a>
      
      
        <a class='next' href='/2020/08/22/%E9%9D%A2%E7%BB%8F%E5%A4%8D%E7%9B%98%E7%B3%BB%E5%88%97%E4%B9%8B%E3%80%8CJava%20GC%E4%B8%AD%E4%BD%BF%E7%94%A8%E5%BC%95%E7%94%A8%E8%AE%A1%E6%95%B0%E6%B3%95%E6%89%80%E5%AD%98%E5%9C%A8%E7%9A%84%E7%BC%BA%E7%82%B9%E3%80%8D%E9%97%AE%E9%A2%98%E5%BA%94%E8%AF%A5%E5%A6%82%E4%BD%95%E5%8E%BB%E6%80%9D%E8%80%83/'>
          <p class='title'>面经复盘系列之「Java GC中使用引用计数法所存在的缺点」问题应该如何去思考<i class="fas fa-chevron-right" aria-hidden="true"></i></p>
          <p class='content'>网抑云二面虽然难偏怪，但是复盘下来，确实能学到很多。也感谢很多大佬跟我分享他们学习的思路和思考的方向，才写了这一篇文章，后续的有缘更新吧。
阅读前必看：如果你只是想知道这个问题的答案，请出门左转...</p>
        </a>
      
    </div>
  
</article>


  

  <article class="post white-box reveal shadow" id="comments">
    <p ct><i class='fas fa-comments'></i> 评论</p>
    
    <div id="valine_container" class="valine_thread">
  <i class="fas fa-cog fa-spin fa-fw fa-2x"></i>
</div>

  </article>






</div>
<aside class='l_side'>
  
  
    
    



  <section class="widget toc-wrapper shadow desktop mobile" id="toc-div" >
    
  <header>
    
      <i class="fas fa-list fa-fw" aria-hidden="true"></i><span class='name'>本文目录</span>
    
  </header>


    <div class='content'>
        <ol class="toc"><li class="toc-item toc-level-2"><a class="toc-link" href="#%E4%B8%80%E9%9D%A2-2020-08-19-19%EF%BC%9A30-20%EF%BC%9A30"><span class="toc-text">一面 2020-08-19 19：30 - 20：30</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E4%BA%8C%E9%9D%A2-2020-08-19-20%EF%BC%9A30-21%EF%BC%9A30"><span class="toc-text">二面 2020-08-19 20：30 - 21：30</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E4%B8%89%E9%9D%A2-2020-08-26"><span class="toc-text">三面 2020-08-26</span></a></li></ol>
    </div>
  </section>


  


</aside>


   <!--此文件用来存放一些不方便取值的变量-->
<!--思路大概是将值藏到重加载的区域内-->

<script>
  window.pdata={}
  pdata.ispage=true;
  pdata.postTitle="字节跳动-深圳Data-后台工程师-一二三面";
  pdata.commentPath="";
  pdata.commentPlaceholder="";

  var l_header=document.getElementById("l_header");
  
  l_header.classList.remove("show");
  
</script>
 
        </div>
        
  
  <footer class="footer clearfix">
    <br><br>
    
      
        <div class="aplayer-container">
          


        </div>
      
    
      
        <br>
        <div class="social-wrapper">
          
            
          
            
          
            
          
        </div>
      
    
      
        <div><p>博客内容遵循 <a target="_blank" rel="noopener" href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh">署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议</a></p>
</div>
      
    
      
        
          <div><p><span id="lc-sv">本站总访问量为 <span id='number'><i class="fas fa-circle-notch fa-spin fa-fw" aria-hidden="true"></i></span> 次</span> <span id="lc-uv">访客数为 <span id='number'><i class="fas fa-circle-notch fa-spin fa-fw" aria-hidden="true"></i></span> 人</span></p>
</div>
        
      
    
      
        
      
    
      
        <div class='copyright'>
        <p><a href="/about/">Copyright © 2021 扭秧歌的一只泱</a> <strong>|</strong> <img src="https://yayako-blog.oss-cn-hangzhou.aliyuncs.com/settings/%E5%A4%87%E6%A1%88%E5%9B%BE%E6%A0%87.png" class="lazyload" data-srcset="https://yayako-blog.oss-cn-hangzhou.aliyuncs.com/settings/%E5%A4%87%E6%A1%88%E5%9B%BE%E6%A0%87.png" srcset="" alt="备案图标"> <a target="_blank" rel="noopener" href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33032402002017">浙公网安备33032402002017号</a> <strong>|</strong> <a target="_blank" rel="noopener" href="https://beian.miit.gov.cn/#/Integrated/index">浙ICP备20015559号</a></p>

        </div>
      
    
  </footer>


        <a
          id="s-top"
          class="fas fa-arrow-up fa-fw"
          href="javascript:void(0)"
        ></a>
      </div>
    </div>
    <div>
      <script>
window.volantis={};
window.volantis.loadcss=document.getElementById("loadcss");
/********************脚本懒加载函数********************************/
function loadScript(src, cb) {
var HEAD = document.getElementsByTagName('head')[0] || document.documentElement;
var script = document.createElement('script');
script.setAttribute('type','text/javascript');
if (cb) script.onload = cb;
script.setAttribute('src', src);
HEAD.appendChild(script);
}
//https://github.com/filamentgroup/loadCSS
var loadCSS = function( href, before, media, attributes ){
	var doc = window.document;
	var ss = doc.createElement( "link" );
	var ref;
	if( before ){
		ref = before;
	}
	else {
		var refs = ( doc.body || doc.getElementsByTagName( "head" )[ 0 ] ).childNodes;
		ref = refs[ refs.length - 1];
	}
	var sheets = doc.styleSheets;
	if( attributes ){
		for( var attributeName in attributes ){
			if( attributes.hasOwnProperty( attributeName ) ){
				ss.setAttribute( attributeName, attributes[attributeName] );
			}
		}
	}
	ss.rel = "stylesheet";
	ss.href = href;
	ss.media = "only x";
	function ready( cb ){
		if( doc.body ){
			return cb();
		}
		setTimeout(function(){
			ready( cb );
		});
	}
	ready( function(){
		ref.parentNode.insertBefore( ss, ( before ? ref : ref.nextSibling ) );
	});
	var onloadcssdefined = function( cb ){
		var resolvedHref = ss.href;
		var i = sheets.length;
		while( i-- ){
			if( sheets[ i ].href === resolvedHref ){
				return cb();
			}
		}
		setTimeout(function() {
			onloadcssdefined( cb );
		});
	};
	function loadCB(){
		if( ss.addEventListener ){
			ss.removeEventListener( "load", loadCB );
		}
		ss.media = media || "all";
	}
	if( ss.addEventListener ){
		ss.addEventListener( "load", loadCB);
	}
	ss.onloadcssdefined = onloadcssdefined;
	onloadcssdefined( loadCB );
	return ss;
};
</script>
<script>
  
  loadCSS("https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@5.14/css/all.min.css", window.volantis.loadcss);
  
  
  
  
</script>
<!-- required -->

<script src="https://cdn.jsdelivr.net/npm/jquery@3.5/dist/jquery.min.js"></script>

<script>
  function pjax_fancybox() {
    $(".md .gallery").find("img").each(function () { //渲染 fancybox
      var element = document.createElement("a"); // a 标签
      $(element).attr("class", "fancybox");
      $(element).attr("pjax-fancybox", "");  // 过滤 pjax
      $(element).attr("href", $(this).attr("src"));
      if ($(this).attr("data-original")) {
        $(element).attr("href", $(this).attr("data-original"));
      }
      $(element).attr("data-fancybox", "images");
      var caption = "";   // 描述信息
      if ($(this).attr('alt')) {  // 判断当前页面是否存在描述信息
        $(element).attr('data-caption', $(this).attr('alt'));
        caption = $(this).attr('alt');
      }
      var div = document.createElement("div");
      $(div).addClass("fancybox");
      $(this).wrap(div); // 最外层套 div ，其实主要作用还是 class 样式
      var span = document.createElement("span");
      $(span).addClass("image-caption");
      $(span).text(caption); // 加描述
      $(this).after(span);  // 再套一层描述
      $(this).wrap(element);  // 最后套 a 标签
    })
    $(".md .gallery").find("img").fancybox({
      selector: '[data-fancybox="images"]',
      hash: false,
      loop: false,
      closeClick: true,
      helpers: {
        overlay: {closeClick: true}
      },
      buttons: [
        "zoom",
        "close"
      ]
    });
  };
  function SCload_fancybox() {
    if ($(".md .gallery").find("img").length == 0) return;
    loadCSS("https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.css", document.getElementById("loadcss"));
    setTimeout(function() {
      loadScript('https://cdn.jsdelivr.net/gh/fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.js', pjax_fancybox)
    }, 1);
  };
  $(function () {
    SCload_fancybox();
  });
</script>


<!-- internal -->

  
  
  
    
<script src="https://cdn.jsdelivr.net/npm/jquery-backstretch@2.1.18/jquery.backstretch.min.js"></script>

    <script type="text/javascript">
        var imgs=["https://yayako-blog.oss-cn-hangzhou.aliyuncs.com/cover/hd.jpg"];
        if ('false' == 'true') {
          function shuffle(arr){
            /*From countercurrent-time*/
            var n = arr.length;
            while(n--) {
              var index = Math.floor(Math.random() * n);
              var temp = arr[index];
              arr[index] = arr[n];
              arr[n] = temp;
            }
          }
          shuffle(imgs);
        }
	  function Pjax_backstretch(){
        
          $.backstretch(
            imgs,
          {
            duration: "10000",
            fade: "1500"
          });
        
	  }
	  loadScript("https://cdn.jsdelivr.net/npm/jquery-backstretch@2.1.18/jquery.backstretch.min.js",Pjax_backstretch)
    </script>
  




<script>
  function loadIssuesJS() {
    if ($(".md").find(".issues-api").length == 0) return;
    setTimeout(function() {
	
	  loadScript('/js/issues.js');
	
    }, 1);
  };
  $(function () {
    loadIssuesJS();
  });
</script>



  <script defer src="https://cdn.jsdelivr.net/npm/vanilla-lazyload@17.1.0/dist/lazyload.min.js"></script>
<script>
  // https://www.npmjs.com/package/vanilla-lazyload
  // Set the options globally
  // to make LazyLoad self-initialize
  window.lazyLoadOptions = {
    elements_selector: ".lazyload",
    threshold: 0
  };
  // Listen to the initialization event
  // and get the instance of LazyLoad
  window.addEventListener(
    "LazyLoad::Initialized",
    function (event) {
      window.lazyLoadInstance = event.detail.instance;
    },
    false
  );
  document.addEventListener('DOMContentLoaded', function () {
    lazyLoadInstance.update();
  });
  document.addEventListener('pjax:complete', function () {
    lazyLoadInstance.update();
  });
</script>




  
  
    <script>
      window.FPConfig = {
        delay: 0,
        ignoreKeywords: [],
        maxRPS: 5,
        hoverDelay: 25
      };
    </script>
    <script defer src="https://cdn.jsdelivr.net/gh/gijo-varghese/flying-pages@2.1.2/flying-pages.min.js"></script>
  




  <script src="https://cdn.jsdelivr.net/npm/clipboard@2/dist/clipboard.min.js"></script>
<script>
    var clipboard = new ClipboardJS('.btn-copy', {
        target: function (trigger) {
            return trigger.nextElementSibling
        }
    });
    function wait(callback, seconds) {
        var timelag = null;
        timelag = window.setTimeout(callback, seconds)
    }
    function pjax_initCopyCode() {
		if($(".highlight .code pre").length+$(".article pre code").length==0)return;
        var copyHtml = '';
        copyHtml += '<button class="btn-copy" data-clipboard-snippet="">';
        copyHtml += '<i class="fas fa-copy"></i><span>COPY</span>';
        copyHtml += '</button>';
        $(".highlight .code pre").before(copyHtml);
        $(".article pre code").before(copyHtml);
        clipboard.off('success').on('success', function (e) {
            let $btn = $(e.trigger);
            $btn.addClass('copied');
            let $icon = $($btn.find('i'));
            $icon.removeClass('fa-copy');
            $icon.addClass('fa-check-circle');
            let $span = $($btn.find('span'));
            $span[0].innerText = 'COPIED';
            wait(function () {
                $icon.removeClass('fa-check-circle');
                $icon.addClass('fa-copy');
                $span[0].innerText = 'COPY'
            }, 2000)
        });
        clipboard.off('error').on('error', function (e) {
            e.clearSelection();
            let $btn = $(e.trigger);
            $btn.addClass('copy-failed');
            let $icon = $($btn.find('i'));
            $icon.removeClass('fa-copy');
            $icon.addClass('fa-times-circle');
            let $span = $($btn.find('span'));
            $span[0].innerText = 'COPY FAILED';
            wait(function () {
                $icon.removeClass('fa-times-circle');
                $icon.addClass('fa-copy');
                $span[0].innerText = 'COPY'
            }, 2000)
        })
    }
    $(function () {
        pjax_initCopyCode()
    });
</script>




   <script src="https://cdn.jsdelivr.net/npm/scrollreveal@4.0.6/dist/scrollreveal.min.js"></script>
<script type="text/javascript">
  function pjax_scrollrebeal() {
    ScrollReveal().reveal('.l_main .reveal', {
      distance: '32px',
      duration: '800',
      interval: '20',
      scale: '1',
      easing: 'ease-out'
    });
  }
  $(function () {
    pjax_scrollrebeal();
  });
</script>






  
  
<script src="https://cdn.jsdelivr.net/npm/valine@1.4/dist/Valine.min.js"></script>


<script>
  function emoji(path, idx, ext) {
    return path + "/" + path + "-" + idx + "." + ext;
  }
  var emojiMaps = {};
  for (var i = 1; i <= 54; i++) {
    emojiMaps['tieba-' + i] = emoji('tieba', i, 'png');
  }
  for (var i = 1; i <= 101; i++) {
    emojiMaps['qq-' + i] = emoji('qq', i, 'gif');
  }
  for (var i = 1; i <= 116; i++) {
    emojiMaps['aru-' + i] = emoji('aru', i, 'gif');
  }
  for (var i = 1; i <= 125; i++) {
    emojiMaps['twemoji-' + i] = emoji('twemoji', i, 'png');
  }
  for (var i = 1; i <= 4; i++) {
    emojiMaps['weibo-' + i] = emoji('weibo', i, 'png');
  }
  function pjax_valine() {
    if(!document.querySelectorAll("#valine_container")[0])return;
    let pagePlaceholder = pdata.commentPlaceholder || "快来评论吧~";
    let path = pdata.commentPath;
    if (path.length == 0) {
      let defaultPath = '';
      path = defaultPath || decodeURI(window.location.pathname);
    }
    var valine = new Valine();
    valine.init(Object.assign({"js":"https://cdn.jsdelivr.net/npm/valine@1.4/dist/Valine.min.js","path":null,"placeholder":"快来评论吧~","appId":"crkoKrezsl4I7UWQjAvOy2N1-gzGzoHsz","appKey":"OUvAeTn1CnCmGFdNYVH00G0S","meta":["nick","mail","link"],"requiredFields":["nick","mail"],"enableQQ":true,"recordIP":false,"avatar":"robohash","pageSize":10,"lang":"zh-cn","highlight":true,"visitor":true,"mathJax":false}, {
      el: '#valine_container',
      path: path,
      placeholder: pagePlaceholder,
      emojiCDN: 'https://cdn.jsdelivr.net/gh/volantis-x/cdn-emoji/valine/',
      emojiMaps: emojiMaps,
    }))
  }
  $(function () {
    pjax_valine();
  });
</script>





  
<script src="/js/app.js"></script>



<!-- optional -->

  <script>
const SearchServiceimagePath="https://cdn.jsdelivr.net/gh/volantis-x/cdn-volantis@master/img/";
const ROOT =  ("/" || "/").endsWith('/') ? ("/" || "/") : ("//" || "/" );

$('.input.u-search-input').one('focus',function(){
	
		loadScript('/js/search/hexo.js',setSearchService);
	
})

function listenSearch(){
  
    customSearch = new HexoSearch({
      imagePath: SearchServiceimagePath
    });
  
}
function setSearchService() {
	listenSearch();
	
		document.addEventListener("pjax:success", listenSearch);
	
}
</script>











  <script defer>

  const LCCounter = {
    app_id: 'u9j57bwJod4EDmXWdxrwuqQT-MdYXbMMI',
    app_key: 'jfHtEKVE24j0IVCGHbvuFClp',
    custom_api_server: '',

    // 查询存储的记录
    getRecord(Counter, url, title) {
      return new Promise(function (resolve, reject) {
        Counter('get', '/classes/Counter?where=' + encodeURIComponent(JSON.stringify({url})))
          .then(resp => resp.json())
          .then(({results, code, error}) => {
            if (code === 401) {
              throw error;
            }
            if (results && results.length > 0) {
              var record = results[0];
              resolve(record);
            } else {
              Counter('post', '/classes/Counter', {url, title: title, times: 0})
                .then(resp => resp.json())
                .then((record, error) => {
                  if (error) {
                    throw error;
                  }
                  resolve(record);
                }).catch(error => {
                console.error('Failed to create', error);
                reject(error);
              });
            }
          }).catch((error) => {
          console.error('LeanCloud Counter Error:', error);
          reject(error);
        });
      })
    },

    // 发起自增请求
    increment(Counter, incrArr) {
      return new Promise(function (resolve, reject) {
        Counter('post', '/batch', {
          "requests": incrArr
        }).then((res) => {
          res = res.json();
          if (res.error) {
            throw res.error;
          }
          resolve(res);
        }).catch((error) => {
          console.error('Failed to save visitor count', error);
          reject(error);
        });
      });
    },

    // 构建自增请求体
    buildIncrement(objectId) {
      return {
        "method": "PUT",
        "path": `/1.1/classes/Counter/${ objectId }`,
        "body": {
          "times": {
            '__op': 'Increment',
            'amount': 1
          }
        }
      }
    },

    // 校验是否为有效的 UV
    validUV() {
      var key = 'LeanCloudUVTimestamp';
      var flag = localStorage.getItem(key);
      if (flag) {
        // 距离标记小于 24 小时则不计为 UV
        if (new Date().getTime() - parseInt(flag) <= 86400000) {
          return false;
        }
      }
      localStorage.setItem(key, new Date().getTime().toString());
      return true;
    },

    addCount(Counter) {
      var enableIncr = '' === 'true' && window.location.hostname !== 'localhost';
      enableIncr = true;
      var getterArr = [];
      var incrArr = [];
      // 请求 PV 并自增
      var pvCtn = document.querySelector('#lc-sv');
      if (pvCtn || enableIncr) {
        var pvGetter = this.getRecord(Counter, 'https://www.yayako.cn' + '/#lc-sv', 'Visits').then((record) => {
          incrArr.push(this.buildIncrement(record.objectId))
          var eles = document.querySelectorAll('#lc-sv #number');
          if (eles.length > 0) {
            eles.forEach((el,index,array)=>{
              el.innerText = record.times + 1;
              if (pvCtn) {
                pvCtn.style.display = 'inline';
              }
            })
          }
        });
        getterArr.push(pvGetter);
      }

      // 请求 UV 并自增
      var uvCtn = document.querySelector('#lc-uv');
      if (uvCtn || enableIncr) {
        var uvGetter = this.getRecord(Counter, 'https://www.yayako.cn' + '/#lc-uv', 'Visitors').then((record) => {
          var vuv = this.validUV();
          vuv && incrArr.push(this.buildIncrement(record.objectId))
          var eles = document.querySelectorAll('#lc-uv #number');
          if (eles.length > 0) {
            eles.forEach((el,index,array)=>{
              el.innerText = record.times + (vuv ? 1 : 0);
              if (uvCtn) {
                uvCtn.style.display = 'inline';
              }
            })
          }
        });
        getterArr.push(uvGetter);
      }

      // 请求文章的浏览数，如果是当前页面就自增
      var allPV = document.querySelectorAll('#lc-pv');
      if (allPV.length > 0 || enableIncr) {
        for (i = 0; i < allPV.length; i++) {
          let pv = allPV[i];
          let title = pv.getAttribute('data-title');
          var url = 'https://www.yayako.cn' + pv.getAttribute('data-path');
          if (url) {
            var viewGetter = this.getRecord(Counter, url, title).then((record) => {
              // 是当前页面就自增
              let curPath = window.location.pathname;
              if (curPath.includes('index.html')) {
                curPath = curPath.substring(0, curPath.lastIndexOf('index.html'));
              }
              if (pv.getAttribute('data-path') == curPath) {
                incrArr.push(this.buildIncrement(record.objectId));
              }
              if (pv) {
                var ele = pv.querySelector('#lc-pv #number');
                if (ele) {
                  if (pv.getAttribute('data-path') == curPath) {
                    ele.innerText = (record.times || 0) + 1;
                  } else {
                    ele.innerText = record.times || 0;
                  }
                  pv.style.display = 'inline';
                }
              }
            });
            getterArr.push(viewGetter);
          }
        }
      }

      // 如果启动计数自增，批量发起自增请求
      if (enableIncr) {
        Promise.all(getterArr).then(() => {
          incrArr.length > 0 && this.increment(Counter, incrArr);
        })
      }

    },


    fetchData(api_server) {
      var Counter = (method, url, data) => {
        return fetch(`${ api_server }/1.1${ url }`, {
          method,
          headers: {
            'X-LC-Id': this.app_id,
            'X-LC-Key': this.app_key,
            'Content-Type': 'application/json',
          },
          body: JSON.stringify(data)
        });
      };
      this.addCount(Counter);
    },

    refreshCounter() {
      var api_server = this.app_id.slice(-9) !== '-MdYXbMMI' ? this.custom_api_server : `https://${ this.app_id.slice(0, 8).toLowerCase() }.api.lncldglobal.com`;
      if (api_server) {
        this.fetchData(api_server);
      } else {
        fetch('https://app-router.leancloud.cn/2/route?appId=' + this.app_id)
          .then(resp => resp.json())
          .then(({api_server}) => {
            this.fetchData('https://' + api_server);
          });
      }
    }

  };

  LCCounter.refreshCounter();

  document.addEventListener('pjax:complete', function () {
    LCCounter.refreshCounter();
  });
</script>








<script>
function listennSidebarTOC() {
  const navItems = document.querySelectorAll(".toc li");
  if (!navItems.length) return;
  const sections = [...navItems].map((element) => {
    const link = element.querySelector(".toc-link");
    const target = document.getElementById(
      decodeURI(link.getAttribute("href")).replace("#", "")
    );
    link.addEventListener("click", (event) => {
      event.preventDefault();
      window.scrollTo({
		top: target.offsetTop + 100,
		
		behavior: "smooth"
		
	  });
    });
    return target;
  });

  function activateNavByIndex(target) {
    if (target.classList.contains("active-current")) return;

    document.querySelectorAll(".toc .active").forEach((element) => {
      element.classList.remove("active", "active-current");
    });
    target.classList.add("active", "active-current");
    let parent = target.parentNode;
    while (!parent.matches(".toc")) {
      if (parent.matches("li")) parent.classList.add("active");
      parent = parent.parentNode;
    }
  }

  function findIndex(entries) {
    let index = 0;
    let entry = entries[index];
    if (entry.boundingClientRect.top > 0) {
      index = sections.indexOf(entry.target);
      return index === 0 ? 0 : index - 1;
    }
    for (; index < entries.length; index++) {
      if (entries[index].boundingClientRect.top <= 0) {
        entry = entries[index];
      } else {
        return sections.indexOf(entry.target);
      }
    }
    return sections.indexOf(entry.target);
  }

  function createIntersectionObserver(marginTop) {
    marginTop = Math.floor(marginTop + 10000);
    let intersectionObserver = new IntersectionObserver(
      (entries, observe) => {
        let scrollHeight = document.documentElement.scrollHeight + 100;
        if (scrollHeight > marginTop) {
          observe.disconnect();
          createIntersectionObserver(scrollHeight);
          return;
        }
        let index = findIndex(entries);
        activateNavByIndex(navItems[index]);
      },
      {
        rootMargin: marginTop + "px 0px -100% 0px",
        threshold: 0,
      }
    );
    sections.forEach((element) => {
      element && intersectionObserver.observe(element);
    });
  }
  createIntersectionObserver(document.documentElement.scrollHeight);
}

document.addEventListener("DOMContentLoaded", listennSidebarTOC);
document.addEventListener("pjax:success", listennSidebarTOC);
</script>

<!-- more -->

  


<script src="https://cdn.jsdelivr.net/npm/pjax@0.2.8/pjax.min.js"></script>


<script>
    var pjax;
    document.addEventListener('DOMContentLoaded', function () {
      pjax = new Pjax({
        elements: 'a[href]:not([href^="#"]):not([href="javascript:void(0)"]):not([pjax-fancybox])',
        selectors: [
          "title",
          "#l_cover",
          "#pjax-container",
          "#pjax-header-nav-list"
        ],
        cacheBust: false,   // url 地址追加时间戳，用以避免浏览器缓存
        timeout: 5000
      });
    });

    document.addEventListener('pjax:send', function (e) {
      //window.stop(); // 相当于点击了浏览器的停止按钮

      try {
        var currentUrl = window.location.pathname;
        var targetUrl = e.triggerElement.href;
        var banUrl = [""];
        if (banUrl[0] != "") {
          banUrl.forEach(item => {
            if(currentUrl.indexOf(item) != -1 || targetUrl.indexOf(item) != -1) {
              window.location.href = targetUrl;
            }
          });
        }
      } catch (error) {}

      window.subData = null; // 移除标题（用于一二级导航栏切换处）
      if (typeof $.fancybox != "undefined") {
        $.fancybox.close();    // 关闭弹窗
      }
      volantis.$switcher.removeClass('active'); // 关闭移动端激活的搜索框
      volantis.$header.removeClass('z_search-open'); // 关闭移动端激活的搜索框
      volantis.$wrapper.removeClass('sub'); // 跳转页面时关闭二级导航

      // 解绑事件 避免重复监听
      volantis.$topBtn.unbind('click');
      $('.menu a').unbind('click');
      $(window).unbind('resize');
      $(window).unbind('scroll');
      $(document).unbind('scroll');
      $(document).unbind('click');
      $('body').unbind('click');
	  
    });

    document.addEventListener('pjax:complete', function () {
      // 关于百度统计对 SPA 页面的处理：
      // 方案一：百度统计>管理>单页应用设置中，打开开启按钮即可对SPA进行统计。 https://tongji.baidu.com/web/help/article?id=324
      // 方案二：取消注释下列代码。 https://tongji.baidu.com/web/help/article?id=235
       

      // 关于谷歌统计对 SPA 页面的处理：
      // 当应用以动态方式加载内容并更新地址栏中的网址时，也应该更新通过 gtag.js 存储的网页网址。
      // https://developers.google.cn/analytics/devguides/collection/gtagjs/single-page-applications?hl=zh-cn
      


      $('.nav-main').find('.list-v').not('.menu-phone').removeAttr("style",""); // 移除小尾巴的移除
      $('.menu-phone.list-v').removeAttr("style",""); // 移除小尾巴的移除
      $('script[data-pjax], .pjax-reload script').each(function () {
        $(this).parent().append($(this).remove());
      });
      try{
          if (typeof $.fancybox == "undefined") {
            SCload_fancybox();
          } else {
            pjax_fancybox();
          }
        
		  Pjax_backstretch()
        
        
        
          pjax_scrollrebeal();
        
        if (typeof IssuesAPI == "undefined") {
          loadIssuesJS();
        }
        
          pjax_initCopyCode();
        
        
          pjax_valine();
        
        
        
        
        
        
      } catch (e) {
        console.log(e);
      }
	  
    });

    document.addEventListener('pjax:error', function (e) {
	  
      window.location.href = e.triggerElement.href;
    });
</script>
 
    </div>
  </body>
</html>
